package com.atguigu.netty.dubborpc.netty;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.Callable;

public class NettyClientHandler extends ChannelInboundHandlerAdapter implements Callable<String> {

    private static Logger logger = LoggerFactory.getLogger(Thread.currentThread().getClass());


    private ChannelHandlerContext context;
    private String result; // 返回的结果
    private String params; // 客户端调用方法，传入的参数

    // 连接成功，被调用，这个方法第一次被调用 （1）
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
         logger.info("channelActive 被调用（1）");
        context = ctx; // 其他方法会使用到ctx
    }

    // 收到数据，被调用
    @Override
    public synchronized void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
         logger.info("channelRead 被调用（3）");

        result = msg.toString();
        notify();// 唤醒等待的线程
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        logger.error("NettyClientHandler异常",cause);
        ctx.close();
    }

    // 被代理对象调用，发送数据给服务端 -> waiting -> 等待被唤醒 ->  返回结果
    @Override
    public synchronized String call() throws Exception {
       logger.info("call1 被调用（2）");
        context.writeAndFlush(params);
        wait(5000); // 等待channelRead收到服务端结果后，被唤醒
         logger.info("call2 被调用（4）");
        return result; // 返回服务端结果
    }

    // 设置参数
    public void setParams(String params) {
        this.params = params;
    }
}
